const state={
    items:[]  //存放所有用户的购物车数据
}
// mutations 用于修改状态（state）
const mutations={
    // state状态对象，item要添加的商品对象
    //添加新的商品到购物车
    pushProductToCart(state,item){
        state.items.push(item);
    },

    //添加购物车时，增加已有商品的数量,同步更新金额
    incrementItemNum(state,item){
        // 获取当前用户及当前商品的购物车数据对应的索引。 findIndex()查找数组中符合条件的元素的下标 对数组中的每个元素执行检查操作
        let index=state.items.findIndex(cart=>cart.uid==item.uid && cart.id==item.id);
        //更新数量,累加
        state.items[index].num+=item.num;
        //更新金额
        state.items[index].currency+=item.num*item.price;
        },

         //当购物车列表中的数量增减时，更新购物车中商品的数量及金额
    updateCartItem(state,item){
        // 获取当前用户及当前商品的购物车数据对应的索引
        let index=state.items.findIndex(cart=>cart.uid==item.uid && cart.id==item.id);
        // 更新数量
        state.items[index].num=item.num;
        // 更新金额
        state.items[index].currency=item.num*item.price;
        },

        //删除购物车中的商品
    deleteCartItem(state,item){
        // 获取当前用户及当前商品的购物车数据对应的索引
        let index=state.items.findIndex(cart=>cart.uid==item.uid && cart.id==item.id);
        // 删除指定下标 index 处的元素，并且只删除一个元素
        state.items.splice(index,1);
},

}

const getters={
    // 根据用户id获取每个用户的购物车数据
    // state.items 中筛选出所有 uid 等于传入的 uid 参数的商品，然后返回这个商品列表。
    getUserCart(state){
        return(uid)=>{
            return state.items.filter(item=>item.uid==uid);
        }
    },

    // 根据用户id获取每个用户购物车中商品的数量
    getItemsCount(state){
        return(uid)=>{
            let filterItems=state.items.filter(item=>item.uid==uid);
            return filterItems.length;
        }
    },

    //根据用户id计算每个用户购物车中商品的总价
    getTotalCurrency(state){
        return (uid)=>{
            let filterItems=state.items.filter(item=>item.uid==uid);
            return filterItems.reduce((total,item)=>{
                return total+item.price*item.num;
            },0);
        }
    },
    
}

//actions就是异步执行mutations
const actions={
    //添加购物车
    // 第一个参数是一个对象，包含了状态对象 state 和提交变化的函数 commit；第二个参数 item 是要添加到购物车的商品对象。
    addCartAction({state,commit},item){
        const cartItem=state.items.find(cart=>cart.uid==item.uid && cart.id==item.id);
        if(!cartItem){ //商品不存在
            commit("pushProductToCart",item);
        }else{
        //商品存在
        commit("incrementItemNum",item);
        }
    }
}

//暴露出来
export default{
    namespaced:true,
    state,
    getters,
    mutations,
    actions
}